#ifndef MPHTTPCONNECTION_H
#define MPHTTPCONNECTION_H

/******************************
 *
 * 名   称：   HttpSocket的适配器 （HttpConnection）
 * 用   途：   1. 针对不同socket连接对象创建适配器，使之具有相同的行为方法 [ 执行SSL握手、写入数据、读取数据、关闭连接等 ]
 *            2. 定义HttpSocket的适配器相关属性 [ Connection的唯一标识、在Pool中对应的Key和最近一次使用时间 ]
 * 作用范围：   公共的
 * 创建时间：   2022-10-03
 * 备   注：   1. 代码中包括 HttpRequestContent 请求体的相关定义。HttpRequestContent 与 HttpRequestMessage 属于聚合关系，
 *            2. HttpConnection 具有 HttpGenericConnection、HttpSslConnection两个派生类，分别对应HTTP及HTTPS连接两种情况。
 *            3. HttpConnection及其派生类建议均通过代码中定义的CreateXXXX相关函数创建，不要自行实例化
 * 参考：
 * https://blog.csdn.net/wangzhiyu1980/article/details/45010885
 * https://www.cnblogs.com/ylcc-zyq/p/14959136.html
 *
 ******************************/


#include <functional>

#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/io_context.hpp>
#include <boost/asio/streambuf.hpp>

namespace MP{
namespace HTTP{

using HttpSocket = boost::asio::basic_socket<boost::asio::ip::tcp>;

using func_handshake_callback = std::function<void(const boost::system::error_code&)>;
using func_write_callback = std::function<void(const boost::system::error_code&, std::size_t)>;
using func_read_callback = std::function<void(const boost::system::error_code&, std::size_t)>;


class HttpConnection
{
public:
    using ptr_s = std::shared_ptr<HttpConnection>;
    //using ptr_u = std::unique_ptr<HttpConnection>;

//    HttpConnection() = default;
//    HttpConnection(const HttpConnection&) = delete;
//    HttpConnection& operator=(const HttpConnection&) = delete;
    virtual ~HttpConnection() = default;

public:
    //设置或读取最近一次使用HttpConnection的时间
    virtual void setLastUseTime(time_t clock) = 0;
    virtual time_t getLastUseTime() const = 0;

    //设置或读取在Pool中对应的Key
    virtual void setPoolKey(const std::string& poolKey) = 0;
    virtual const std::string& getPoolKey() const = 0;

    //返回连接ID，Connection的唯一标识
    virtual const std::string& getId() const = 0;

    virtual HttpSocket& getHttpSocket() = 0;

    virtual void handshakeAsync(func_handshake_callback&& handler) = 0;

    virtual void writeSomeAsync(const std::vector<boost::asio::const_buffer>& buffers,
                                func_write_callback&& handler) = 0;
    virtual void readSomeAsync(const boost::asio::mutable_buffer& buffers,
                               func_read_callback&& handler) = 0;

    //取消当前操作
    virtual void cancle() = 0;
    //设置已连接
    virtual void changeToConnect() = 0;
    //断开连接
    virtual void disConnected() = 0;
    //返回连接是否已连接上
    virtual bool isConnected() = 0;
    //是否为HTTPS加密连接
    virtual bool isSsl() const = 0;
};




}   //HTTP
}   //MP




#endif // MPHTTPCONNECTION_H
